package com.wzkun.aicraft.ai;

import com.wzkun.aicraft.ai.model.HtmlCodeResult;
import com.wzkun.aicraft.ai.model.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

/**
 * AI代码生成服务接口
 *
 * @author wzk
 * @since 2025/11/10
 */
public interface AiCodeGeneratorService {

    /**
     * 生成原生HTML代码
     *
     * @param userMessage 用户输入的消息
     * @return 生成代码
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode(String userMessage);
    // 不适用内置的会话隔离 使用AI Service层面的隔离 每个应用分配不同的AI Service
//    HtmlCodeResult generateHtmlCode(@MemoryId int memoryId, @UserMessage String userMessage)

    /**
     * 生成原生多文件代码
     *
     * @param userMessage 用户输入的消息
     * @return 生成代码
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(String userMessage);

    /**
     * 生成原生HTML代码
     *
     * @param userMessage 用户输入的消息
     * @return 生成代码
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    Flux<String> generateHtmlCodeStream(String userMessage);

    /**
     * 生成原生多文件代码
     *
     * @param userMessage 用户输入的消息
     * @return 生成代码
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStream(String userMessage);

    /**
     * 生成 Vue 项目代码（流式）
     * 使用了@MemoryId注解，就一定要使用UserMessage注解
     *
     * @param appId 应用ID
     * @param userMessage 用户消息
     * @return 生成过程的流式响应
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt.txt")
    TokenStream generateVueProjectCodeStream(@MemoryId long appId, @UserMessage String userMessage);
}

